昨天的文章中有稍微介紹了關於指標的一些觀念
但皆僅限於main body中的介紹,因此就有了今天更詳細的介紹
該如何從Function中使用指標的方式來取值或址呢?
這邊有幾個觀念分為
假設有兩個變數
int x=1,y=2;
.
.
.
y=5;
如果今天修改y時,如果x沒被受影響那就是傳值(by value)
其中又有分語言
不同語言default上在傳遞變數是傳值還傳址時都皆不同
那麼傳址呢?
以下有個例子,也就是將變數的記憶體位址丟給其他變數
使得其他變數再修改數值時原本的變數也會跟著更改
這麼說可能有一點抽象,因此就以例子來講解
void f(int *a, int *b){
*a=*b+2;
*b=*a*2;
}
int main(){
int x=1,y=2;
int *p=&x,*q=&y;
f(p,q);
//f(&x,&y);
}
main body將p,q位址丟給function f並用指標指向該位址
之後當*a 修改值時x也會跟著變且*b也是如此
這種方式就是傳址的情況下會發生的
OK,如果上面介紹都能消化的話那就再來雙重指標的部分 到底要逼死誰
那麼何謂雙重指標呢? 其實就是多一顆星啦
一樣直接以例子來介紹搭上圖來消化應該會比較好了解?
void f(int a,int *pa,int *pb, int *pb,int **ppa, int **ppb){
int b=0;
b=*pa;
*pb = **ppb+b+a;
*ppa = pb; pb=pa; pa=*ppb;
*pa = **ppb+b;
}
int main(){
int a=2,b=3,c=4;
int *pa=&a,*pb=&b;
f(c,pa,&c,&pa,&pb);
}
這邊我們拆成兩部分來理解
第一部分是將main body的變數都設定好後
根據條件傳遞給function f
這邊可以看到function f中出現了雙重指標,因此在main body時傳入的變數是指標的記憶體位址
及為**ppa = &pa, **b = &pb
再來呢就是有點小麻煩的地方了
可以看到分為五個step
- *pb = **ppb + b + a
- ppa = pb 這邊可以看到 所謂的ppa 其實就是*pa所指向的記憶體位址
- pb = pa
- pa = ppb 而這邊因為 pa為指標 因此賦予位址的方式是以ppb
- *pa = **ppb + b